home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d945.lha / Reminder / src / src.lha / Gadfunc.c < prev    next >
C/C++ Source or Header  |  1993-04-19  |  14KB  |  631 lines

  1. /* User interface functions for Reminder */
  2.  
  3. /* $Id: Gadfunc.c,v 1.12 1993/04/18 21:52:14 Matti_Rintala Exp $ */
  4.  
  5. #include <ctype.h>
  6.  
  7. #include <exec/types.h>
  8. #include <exec/exec.h>
  9. #include <utility/tagitem.h>
  10. #include <dos/dos.h>
  11.  
  12. #include <exec/libraries.h>
  13. #include <libraries/reqtools.h>
  14.  
  15. #include <intuition/intuition.h>
  16.  
  17. #include "Globals.h"
  18. #include "Gadutil.h"
  19. #include "Events.h"
  20. #include "Gadfunc.h"
  21.  
  22. #ifdef __SASC
  23. #include <proto/dos.h>
  24. #include <proto/reqtools.h>
  25. #include <proto/intuition.h>
  26. #endif
  27.  
  28. #ifdef _DCC
  29. #include <clib/dos_protos.h>
  30. #include <clib/reqtools_protos.h>
  31. #include <clib/intuition_protos.h>
  32. #endif
  33.  
  34. static int CheckGadgets(void);
  35.  
  36.  
  37. void InitGadgets(void) {
  38.  
  39.   /* Try to load database from file */
  40.   LoadEvents(filename);
  41.  
  42.   /* Initialize events */
  43.   AttachEventlist(InitEvents());
  44.  
  45.   /* Initialize all gadgets */
  46.   NewEvent();
  47.   SetEvent();
  48. }
  49.  
  50. void ExitGadgets(void) {
  51.  
  52.   /* Save database, if changed */
  53.   if (changed) {
  54.     if (SaveEvents(filename)) {
  55.       rtEZRequestTags("Could not save database!", "OK", NULL, NULL,
  56.               RT_LockWindow, (Tag)TRUE, TAG_END);
  57.     }
  58.   }
  59. }
  60.  
  61. /* CheckGadgets checks the contents of all event gadgets and updates values
  62.    of globals. If some value is illegal, that gadget is activated and
  63.    TRUE is returned */
  64. static int CheckGadgets(void) {
  65.  
  66.   struct Gadget *gad;
  67.  
  68.   /* Check all gadgets that can be altered without event (strings) */
  69.   gad = MainGadgets[GDX_Day];
  70.   if (CheckInt(gad, 1, 31, &day)) {
  71.     ActivateGadget(gad, MainWnd, NULL);
  72.     return TRUE;
  73.   }
  74.   gad = MainGadgets[GDX_Month];
  75.   if (CheckMonth()) {
  76.     ActivateGadget(gad, MainWnd, NULL);
  77.     return TRUE;
  78.   }
  79.   gad = MainGadgets[GDX_Year];
  80.   if (CheckInt(gad, 0, MAXYEAR, &year) || (year > 99 && year < MINYEAR)) {
  81.     if (year < MINYEAR)
  82.       DisplayBeep(NULL);
  83.     ActivateGadget(gad, MainWnd, NULL);
  84.     return TRUE;
  85.   }
  86.   /* Add missing centuries, if necessary */
  87.   if (year <= 99 && *((struct StringInfo *)gad->SpecialInfo)->Buffer != '\0') {
  88.     year += (year < MINYEAR%100) ? 2000 : 1900;
  89.     SetYear(year);
  90.   }
  91.  
  92.   gad = MainGadgets[GDX_Before];
  93.   if (CheckInt(gad, 1, MAXBEFORE, &before)) {
  94.     ActivateGadget(gad, MainWnd, NULL);
  95.     return TRUE;
  96.   }
  97.   gad = MainGadgets[GDX_After];
  98.   if (CheckInt(gad, 1, MAXAFTER, &after)) {
  99.     ActivateGadget(gad, MainWnd, NULL);
  100.     return TRUE;
  101.   }
  102.   gad = MainGadgets[GDX_Text];
  103.   if (CheckText()) {
  104.     ActivateGadget(gad, MainWnd, NULL);
  105.     return TRUE;
  106.   }
  107.  
  108.   return FALSE;
  109. }
  110.     
  111.  
  112. /* Functions below this are called by GadToolsBox-generated IDCMP-handler */
  113.  
  114. int YearClicked( void )
  115. {
  116.     /* routine when gadget "_Year" is clicked. */
  117.  
  118.   struct Gadget *gad = MainGadgets[GDX_Year];
  119.  
  120.   /* Check the new value */
  121.   if (CheckInt(gad, 0, MAXYEAR, &year) || (year > 99 && year < MINYEAR)) {
  122.     if (year < MINYEAR)
  123.       DisplayBeep(NULL);
  124.     ActivateGadget(gad, MainWnd, NULL);
  125.   }
  126.   /* Add missing centuries, if necessary */
  127.   if (year <= 99 && *((struct StringInfo *)gad->SpecialInfo)->Buffer != '\0') {
  128.     year += (year < MINYEAR%100) ? 2000 : 1900;
  129.     SetYear(year);
  130.   }
  131.  
  132.   ShowWDay();            /* Check ShowWDay gadget */
  133.  
  134.   edited = TRUE;            /* Event has been edited */
  135.  
  136.   return 1;
  137. }
  138.  
  139. int MonthClicked( void )
  140. {
  141.     /* routine when gadget "_Month" is clicked. */
  142.  
  143.   /* Check the new value */
  144.   if (CheckMonth())
  145.     ActivateGadget(MainGadgets[GDX_Month], MainWnd, NULL);
  146.  
  147.   ShowWDay();            /* Check ShowWDay gadget */
  148.  
  149.   edited = TRUE;        /* Event has been edited */
  150.  
  151.   return 1;
  152. }
  153.  
  154. int MonthListClicked( void )
  155. {
  156.     /* routine when gadget "" is clicked. */
  157.   /* Set month, list starts from 0 and 12 is ANY */
  158.   month = (MainMsg.Code != 12) ? (MainMsg.Code+1) : 0;
  159.  
  160.   ShowWDay();            /* Check ShowWDay gadget */
  161.  
  162.   edited = TRUE;        /* Event has been edited */
  163.  
  164.   return 1;
  165. }
  166.  
  167. int DayClicked( void )
  168. {
  169.     /* routine when gadget "_Day" is clicked. */
  170.  
  171.   struct Gadget *gad = MainGadgets[GDX_Day];
  172.  
  173.   /* Check the new value */
  174.   if (CheckInt(gad, 1, 31, &day))
  175.     ActivateGadget(gad, MainWnd, NULL);
  176.  
  177.   ShowWDay();            /* Check ShowWDay gadget */
  178.  
  179.   edited = TRUE;        /* Event has been edited */
  180.  
  181.   return 1;
  182. }
  183.  
  184. int WeekdayClicked( void )
  185. {
  186.     /* routine when gadget "Weekday" is clicked. */
  187.   /* Set day of the week from IntuiMessage */
  188.   wday = (MainMsg.Code != 7) ? (MainMsg.Code+1) : 0;
  189.  
  190.   ShowWDay();            /* Check ShowWDay gadget */
  191.  
  192.   edited = TRUE;        /* Event has been edited */
  193.  
  194.   return 1;
  195. }
  196.  
  197. int BeforeClicked( void )
  198. {
  199.     /* routine when gadget "_Before" is clicked. */
  200.  
  201.   struct Gadget *gad = MainGadgets[GDX_Before];
  202.  
  203.   /* Check the new value */
  204.   if (CheckInt(gad, 1, MAXBEFORE, &before))
  205.     ActivateGadget(gad, MainWnd, NULL);
  206.  
  207.   edited = TRUE;        /* Event has been edited */
  208.  
  209.   return 1;
  210. }
  211.  
  212. int AfterClicked( void )
  213. {
  214.     /* routine when gadget "A_fter" is clicked. */
  215.  
  216.   struct Gadget *gad = MainGadgets[GDX_After];
  217.  
  218.   /* Check the new value */
  219.   if (CheckInt(gad, 1, MAXAFTER, &after))
  220.     ActivateGadget(gad, MainWnd, NULL);
  221.  
  222.   edited = TRUE;        /* Event has been edited */
  223.  
  224.   return 1;
  225. }
  226.  
  227. int AutodeleteClicked( void )
  228. {
  229.     /* routine when gadget "_Delete event when expired" is clicked. */
  230.  
  231.   autodelete = !autodelete;    /* Toggle Autodelete setting */
  232.   SetAutodelete(autodelete);    /* Refresh gadget state (needed if keypressed) */
  233.   
  234.   edited = TRUE;        /* Event has been edited */
  235.  
  236.   return 1;
  237. }
  238.  
  239. int GroupedClicked( void )
  240. {
  241.     /* routine when gadget "_Grouped" is clicked. */
  242.  
  243.   grouped = !grouped;        /* Toggle Grouped setting */
  244.   SetGrouped(grouped);        /* Refresh gadget state (needed if keypressed) */
  245.  
  246.   edited = TRUE;        /* Event has been edited */
  247.  
  248.   return 1;
  249. }
  250.  
  251. int TextClicked( void )
  252. {
  253.     /* routine when gadget "_Text" is clicked. */
  254.   if (CheckText())
  255.     ActivateGadget(MainGadgets[GDX_Text], MainWnd, NULL);
  256.  
  257.   edited = TRUE;        /* Event has been edited */
  258.  
  259.   return 1;
  260. }
  261.  
  262. int EventlistClicked( void )
  263. {
  264.     /* routine when gadget "Events in memory:" is clicked. */
  265.  
  266.   int oldevent = event;        /* Backup of the current event */
  267.  
  268.   event = MainMsg.Code;
  269.   if (!GetEvent()) {
  270.     event = oldevent;        /* If event wasn't changed */
  271.     SetEventlist(event);    /* Reselect the old event */
  272.   }
  273.   else
  274.     SetEvent();            /* Otherwise update event gadgets */
  275.  
  276.   return 1;
  277. }
  278.  
  279. int NewClicked( void )
  280. {
  281.     /* routine when gadget "_New" is clicked. */
  282.   NewEvent();            /* Make new event */
  283.   if (event == ~0) {
  284.     /* If event was reset, update gadgets */
  285.     SetEvent();            /* Update gadgets */
  286.     ResetEvent();        /* Deselect event in Eventlist */
  287.   }
  288.  
  289.   return 1;
  290. }
  291.  
  292. int AddClicked( void )
  293. {
  294.     /* routine when gadget "_Add" is clicked. */
  295.   /* Add event if gadgets are valid */
  296.   if (!CheckGadgets()) {
  297.     DetachEventlist();        /* Detach the event list from gadget */
  298.     /* Add new event and attach list back to gadget */
  299.     AttachEventlist(AddEvent());
  300.     SetEventlist(event);    /* Select the new event */
  301.   }
  302.  
  303.   return 1;
  304. }
  305.  
  306. int RemoveClicked( void )
  307. {
  308.     /* routine when gadget "_Remove" is clicked. */
  309.   if (event != ~0) {
  310.     /* If event is selected */
  311.     DetachEventlist();        /* Detach the event list from gadget */
  312.     /* Remove event and attach list back */
  313.     AttachEventlist(RemoveEvent());
  314.     event = ~0;            /* No event selected now */
  315.   }
  316.   else {
  317.     rtEZRequestTags("No event selected!","OK", NULL, NULL,
  318.             RT_LockWindow, (Tag)TRUE, TAG_END);
  319.   }
  320.  
  321.   return 1;
  322. }
  323.  
  324. int UpdateClicked( void )
  325. {
  326.     /* routine when gadget "_Update" is clicked. */
  327.   if (event != ~0) {
  328.     /* If event selected, update if gadgets valid */
  329.     if (!CheckGadgets()) {
  330.       DetachEventlist();        /* Detach the event list from gadget */
  331.       /* Update event and attach list back */
  332.       AttachEventlist(UpdateEvent());
  333.       SetEventlist(event);    /* Select the new event */
  334.     }
  335.   }
  336.   else {
  337.     rtEZRequestTags("No event selected!","OK", NULL, NULL,
  338.             RT_LockWindow, (Tag)TRUE, TAG_END);
  339.   }
  340.  
  341.   return 1;
  342. }
  343.  
  344. int CancelClicked( void )
  345. {
  346.     /* routine when gadget "_Quit, no save" is clicked. */
  347.  
  348.   /* Ask for confirmation if event in gadgets has been edited */
  349.   if (edited) {
  350.     if (!rtEZRequestTags("You have edited\nthe current event.\nAbandon changes?",
  351.              "_Yes|Oh, _no!", NULL, NULL, RT_LockWindow, (Tag)TRUE,
  352.              RT_Underscore, (Tag)'_', RTEZ_DefaultResponse, (Tag)0,
  353.              TAG_END)) {
  354.       /* If user does not want to abandon changes */
  355.       return 1;
  356.     }
  357.   }
  358.  
  359.   /* Ask for confirmation if database was changed */
  360.   if (changed == 1) {
  361.     if (!rtEZRequestTags("Really quit and\nabandon changes?", "_Yes!|_No way", NULL,
  362.             NULL, RT_LockWindow, (Tag)TRUE, RT_Underscore, (Tag)'_',
  363.             RTEZ_DefaultResponse, (Tag)0, TAG_END)) {
  364.       /* If user does not want to exit */
  365.       return 1;
  366.     }
  367.     changed = 0;        /* User did not wish to save changes */
  368.   }
  369.  
  370.   return 0;
  371. }
  372.  
  373. int QuitClicked( void )
  374. {
  375.     /* routine when gadget "Quit and _save" is clicked. */
  376.  
  377.   /* Ask for confirmation if event in gadgets has been edited */
  378.   if (edited) {
  379.     if (!rtEZRequestTags("You have edited\nthe current event.\nAbandon changes?",
  380.              "_Yes|Oh, _no!", NULL, NULL, RT_LockWindow, (Tag)TRUE,
  381.              RT_Underscore, (Tag)'_', RTEZ_DefaultResponse, (Tag)0,
  382.              TAG_END)) {
  383.       /* If user does not want to abandon changes */
  384.       return 1;
  385.     }
  386.   }
  387.  
  388.   return 0;
  389. }
  390.  
  391. int ARexxComClicked( void )
  392. {
  393.     /* routine when gadget "C_omm/Script" is clicked. */
  394.   if (CheckCom())
  395.     ActivateGadget(MainGadgets[GDX_ARexxCom], MainWnd, NULL);
  396.  
  397.   edited = TRUE;        /* Event has been edited */
  398.  
  399.   return 1;
  400. }
  401.  
  402. int ARexxModeClicked( void )
  403. {
  404.     /* routine when gadget "" is clicked. */
  405.   mode = MainMsg.Code;        /* Get new mode */
  406.   /* Disable or enable ARexxPort gadget depending on new mode */
  407.   SetAMode(mode);        /* (De)select other ARexx gadgets */
  408.  
  409.   edited = TRUE;
  410.  
  411.   return 1;
  412. }
  413.  
  414. int ARexxPortClicked( void )
  415. {
  416.     /* routine when gadget "_Port" is clicked. */
  417.   if (CheckPort())
  418.     ActivateGadget(MainGadgets[GDX_ARexxPort], MainWnd, NULL);
  419.  
  420.   edited = TRUE;        /* Event has been edited */
  421.  
  422.   return 1;
  423. }
  424.  
  425. int MainCloseWindow( void )
  426. {
  427.     /* routine for "IDCMP_CLOSEWINDOW". */
  428.  
  429.   /* Ask for confirmation if event in gadgets has been edited */
  430.   if (edited) {
  431.     if (!rtEZRequestTags("You have edited\nthe current event.\nAbandon changes?",
  432.              "_Yes|Oh, _no!", NULL, NULL, RT_LockWindow, (Tag)TRUE,
  433.              RT_Underscore, (Tag)'_', RTEZ_DefaultResponse, (Tag)0,
  434.              TAG_END)) {
  435.       /* If user does not want to abandon changes */
  436.       return 1;
  437.     }
  438.   }
  439.  
  440.   /* Ask whether user wants to save changes (if any) */
  441.   if (changed == 1) {
  442.     if (!rtEZRequestTags("Save changes\nbefore quitting?", "_Yes|_No!", NULL, NULL,
  443.             RT_LockWindow, (Tag)TRUE, RT_Underscore, (Tag)'_', TAG_END)) {
  444.       /* If user does not want to save changes */
  445.       changed = 0;
  446.     }
  447.   }
  448.  
  449.   return 0;
  450. }
  451.  
  452. int MainVanillaKey( void )
  453. {
  454.     /* routine for "IDCMP_VANILLAKEY". */
  455.   BOOL shifted;            /* Is the letter shifted? */
  456.  
  457.   /* Parse keyboard shortcuts */
  458.  
  459.   /* Keys from '0' to '7' are weekdays */
  460.   if (MainMsg.Code >= '0' && MainMsg.Code <= '7') {
  461.     wday = MainMsg.Code - '0';
  462.     SetWDay(wday);
  463.     ShowWDay();
  464.     return 1;
  465.   }
  466.  
  467.   /* Notice shifted letters A-Z */
  468.   shifted = (MainMsg.Code >= 'A' && MainMsg.Code <= 'Z');
  469.  
  470.   /* Parse lowercase key */
  471.   switch (tolower(MainMsg.Code)) {
  472.  
  473.     /* Boolean and check gadgets: */
  474.   case 'a':
  475.     PressButton(MainGadgets[GDX_Add]);
  476.     return AddClicked();
  477.   case 'r':
  478.     PressButton(MainGadgets[GDX_Remove]);
  479.     return RemoveClicked();
  480.   case 'u':
  481.     PressButton(MainGadgets[GDX_Update]);
  482.     return UpdateClicked();
  483.   case 'q':
  484.     PressButton(MainGadgets[GDX_Cancel]);
  485.     return CancelClicked();
  486.   case 's':
  487.     PressButton(MainGadgets[GDX_Quit]);
  488.     return QuitClicked();
  489.   case 'n':
  490.     PressButton(MainGadgets[GDX_New]);
  491.     return NewClicked();
  492.   case 'e':
  493.     return AutodeleteClicked();
  494.   case 'g':
  495.     return GroupedClicked();
  496.  
  497.     /* Radio buttons */
  498.   case 'c':
  499.     mode = AREXXCMODE;
  500.     SetAMode(mode);
  501.     break;
  502.   case 'i':
  503.     mode = AREXXSMODE;
  504.     SetAMode(mode);
  505.     break;
  506.   case 'h':
  507.     mode = AREXXNMODE;
  508.     SetAMode(mode);
  509.     break;
  510.  
  511.     /* String and integer gadgets */
  512.   case 'b':
  513.     ActivateGadget(MainGadgets[GDX_Before], MainWnd, NULL);
  514.     break;
  515.   case 'f':
  516.     ActivateGadget(MainGadgets[GDX_After], MainWnd, NULL);
  517.     break;
  518.   case 'd':
  519.     ActivateGadget(MainGadgets[GDX_Day], MainWnd, NULL);
  520.     break;
  521.   case 'm':
  522.     ActivateGadget(MainGadgets[GDX_Month], MainWnd, NULL);
  523.     break;
  524.   case 'y':
  525.     ActivateGadget(MainGadgets[GDX_Year], MainWnd, NULL);
  526.     break;
  527.   case 't':
  528.     ActivateGadget(MainGadgets[GDX_Text], MainWnd, NULL);
  529.     break;
  530.   case 'p':
  531.     if (mode == AREXXCMODE) {
  532.       /* Only allow activation of Port gagdet in ARexxCommand mode */
  533.       ActivateGadget(MainGadgets[GDX_ARexxPort], MainWnd, NULL);
  534.     }
  535.     break;
  536.   case 'o':
  537.     if (mode != AREXXNMODE) {
  538.       /* Do not allow activation in No ARexx mode */
  539.       ActivateGadget(MainGadgets[GDX_ARexxCom], MainWnd, NULL);
  540.     }
  541.     break;
  542.  
  543.   /* ListView gadgets */
  544.   case 'w':
  545.     /* Weekday, direction depends on shift */
  546.     if (shifted) {
  547.       /* Select previous weekday */
  548.       if (wday == 0)
  549.     wday = 7;
  550.       else
  551.     wday--;
  552.     }
  553.     else {
  554.       /* Select next event */
  555.       if (wday == 7)
  556.     wday = 0;
  557.       else
  558.     wday++;
  559.     }
  560.     SetWDay(wday);
  561.     ShowWDay();            /* Check showed weekday */
  562.     break;
  563.     
  564.   case 'v':
  565.     /* Event, direction depends on shift */
  566.     if (eventno != 0) {        /* Only if events available */
  567.       if (shifted) {
  568.     /* Select previous event */
  569.     if (event == ~0 || event == 0)
  570.       event = eventno-1;    /* Last event */
  571.     else
  572.       event--;
  573.       }
  574.       else {
  575.     /* Select next event */
  576.     if (event == ~0 || event == eventno-1)
  577.       event = 0;    /* Last event */
  578.     else
  579.       event++;
  580.       }
  581.       SetEventlist(event);
  582.       GetEvent();
  583.       SetEvent();
  584.     }
  585.     break;
  586.  
  587.   }
  588.   
  589.  
  590.   return 1;
  591. }
  592.  
  593. int MainRawKey( void )
  594. {
  595.     /* routine for "IDCMP_RAWKEY". */
  596.  
  597.   /* Check rawkeys */
  598.  
  599.   switch (MainMsg.Code) {
  600.  
  601.   case CURSORUP:
  602.     /* Select previous event */
  603.     if (eventno != 0) {
  604.       if (event == ~0 || event == 0)
  605.     event = eventno-1;    /* Last event */
  606.       else
  607.     event--;
  608.       SetEventlist(event);
  609.       GetEvent();
  610.       SetEvent();
  611.     }
  612.     break;
  613.  
  614.   case CURSORDOWN:
  615.     /* Select next event */
  616.     if (eventno != 0) {
  617.       if (event == ~0 || event == eventno-1)
  618.     event = 0;    /* Last event */
  619.       else
  620.     event++;
  621.       SetEventlist(event);
  622.       GetEvent();
  623.       SetEvent();
  624.     }
  625.     break;
  626.   }
  627.  
  628.   return 1;
  629. }
  630.  
  631.